﻿/**
* @author 愚人码头
*/
(function ($) {
    $.fn.Slide = function (options) {
        var opts = $.extend({}, $.fn.Slide.deflunt, options);
        var index = 1;
        var targetLi = $("." + opts.claNav + " li", $(this)); //目标对象
        var clickNext = $("." + opts.claNav + " .next", $(this)); //点击下一个按钮
        var clickPrev = $("." + opts.claNav + " .prev", $(this)); //点击上一个按钮
        var ContentBox = $("." + opts.claCon, $(this)); //滚动的对象
        var ContentBoxNum = ContentBox.children().size(); //滚动对象的子元素个数
        var slideH = ContentBox.children().first().height(); //滚动对象的子元素个数高度，相当于滚动的高度
        var slideW = ContentBox.children().first().width(); //滚动对象的子元素宽度，相当于滚动的宽度
        var autoPlay;
        var slideWH;
        if (opts.effect == "scroolY" || opts.effect == "scroolTxt") {
            slideWH = slideH;
        } else if (opts.effect == "scroolX" || opts.effect == "scroolLoop") {
            ContentBox.css("width", ContentBoxNum * slideW);
            slideWH = slideW;
        } else if (opts.effect == "fade") {
            ContentBox.children().first().css("z-index", "1");
        }

        return this.each(function () {
            var $this = $(this);
            //滚动函数
            var doPlay = function () {
                $.fn.Slide.effect[opts.effect](ContentBox, targetLi, index, slideWH, opts);
                index++;
                if (index * opts.steps >= ContentBoxNum) {
                    index = 0;
                }
            };
            clickNext.click(function (event) {
                $.fn.Slide.effectLoop.scroolLeft(ContentBox, targetLi, index, slideWH, opts, function () {
                    for (var i = 0; i < opts.steps; i++) {
                        ContentBox.find("li:first", $this).appendTo(ContentBox);
                    }
                    ContentBox.css({ "left": "0" });
                });
                event.preventDefault();
            });
            clickPrev.click(function (event) {
                for (var i = 0; i < opts.steps; i++) {
                    ContentBox.find("li:last").prependTo(ContentBox);
                }
                ContentBox.css({ "left": -index * opts.steps * slideW });
                $.fn.Slide.effectLoop.scroolRight(ContentBox, targetLi, index, slideWH, opts);
                event.preventDefault();
            });
            //自动播放
            if (opts.autoPlay) {
                autoPlay = setInterval(doPlay, opts.timer);
                ContentBox.hover(function () {
                    if (autoPlay) {
                        clearInterval(autoPlay);
                    }
                }, function () {
                    if (autoPlay) {
                        clearInterval(autoPlay);
                    }
                    autoPlay = setInterval(doPlay, opts.timer);
                });
            }

            //目标事件
            targetLi.hover(function () {
                if (autoPlay) {
                    clearInterval(autoPlay);
                }
                index = targetLi.index(this);
                window.setTimeout(function () { $.fn.Slide.effect[opts.effect](ContentBox, targetLi, index, slideWH, opts); }, 200);

            }, function () {
                if (autoPlay) {
                    clearInterval(autoPlay);
                }
                autoPlay = setInterval(doPlay, opts.timer);
            });
        });
    };
    $.fn.Slide.deflunt = {
        effect: "scroolY",
        autoPlay: true,
        speed: "normal",
        timer: 1000,
        defIndex: 0,
        claNav: "JQ-slide-nav",
        claCon: "JQ-slide-content",
        steps: 1
    };
    $.fn.Slide.effectLoop = {
        scroolLeft: function (contentObj, navObj, i, slideW, opts, callback) {
            contentObj.animate({ "left": -i * opts.steps * slideW }, opts.speed, callback);
            if (navObj) {
                navObj.eq(i).addClass("on").siblings().removeClass("on");
            }
        },

        scroolRight: function (contentObj, navObj, i, slideW, opts, callback) {
            contentObj.stop().animate({ "left": 0 }, opts.speed, callback);

        }
    }
    $.fn.Slide.effect = {
        fade: function (contentObj, navObj, i, slideW, opts) {
            contentObj.children().eq(i).stop().animate({ opacity: 1 }, opts.speed).css({ "z-index": "1" }).siblings().animate({ opacity: 0 }, opts.speed).css({ "z-index": "0" });
            navObj.eq(i).addClass("on").siblings().removeClass("on");
        },
        scroolTxt: function (contentObj, undefined, i, slideH, opts) {
            //alert(i*opts.steps*slideH);
            contentObj.animate({ "margin-top": -opts.steps * slideH }, opts.speed, function () {
                for (var j = 0; j < opts.steps; j++) {
                    contentObj.find("li:first").appendTo(contentObj);
                }
                contentObj.css({ "margin-top": "0" });
            });
        },
        scroolX: function (contentObj, navObj, i, slideW, opts, callback) {
            contentObj.stop().animate({ "left": -i * opts.steps * slideW }, opts.speed, callback);
            if (navObj) {
                navObj.eq(i).addClass("on").siblings().removeClass("on");
            }
        },
        scroolY: function (contentObj, navObj, i, slideH, opts) {
            contentObj.stop().animate({ "top": -i * opts.steps * slideH }, opts.speed);
            if (navObj) {
                navObj.eq(i).addClass("on").siblings().removeClass("on");
            }
        }
    };
})(jQuery); 